const fs = require('fs');
const crypto = require('crypto');
module.exports = (options, app) => {
    return async function (ctx, next) {
        // 强缓存，设置过期时间
        // http 1.0，设置Expires，要求utc格式
        // ctx.set('Expires', new Date('2024-6-16 :00:00:00').toUTCString());
        /*
        http 2.0，设置Cache-Control，可选值有:
        max-age=31536000，表示缓存时间，以秒为单位，如果与Expires同时出现，max-age优先级更高
        public表示资源既可以被浏览器缓存也可以被代理服务器例如cdn缓存
        private表示只能被浏览器缓存
        no-cache表示不走强缓存，走协商缓存
        no-store表示不缓存
        */
        // ctx.set('Cache-Control', options?.polify || 'public, max-age=10'); 
        // 强缓存与协商缓存同时出现，优先强缓存，通过设置Cache-Control:no-cache，可以强制走协商缓存
        // 协商缓存有 两种方式，1.Last-Modified  2.Etag
        // 1. Last-modified 通过比对文件最后修改时间判断是否缓存，第二次请求时浏览器会返回If-Modified-Since，该字段是记录的上次的Last-modified，如果当前的Last-modified与If-modified-Since相等，即说明资源未变动，使用缓存资源
        // const modifyTime = fs.statSync("public/resource.html").mtime.toISOString();
        // if (ctx.get('If-Modified-Since') === modifyTime) {
        //      ctx.send({code:304,data:"Modified 缓存资源"})
        //      return
        // }
        // ctx.set("Cache-Control", "no-cache")
        // ctx.set('Last-Modified', modifyTime)
        // await next();
        // 2.Etag 可通过比对文件内容的hash是否变化判断是否缓存，第二次请求时浏览器会返回If-Mono-Match，该字段是记录的上次的hash，如果当前的hash与If-Mono-Match相等，即说明资源未变动，使用缓存资源
        const hash = crypto.createHash('sha256').update(fs.readFileSync("public/resource.html")).digest("hex")
        if (ctx.get('If-None-Match') === hash) {
            ctx.send({ code: 304, data: "etag 缓存资源" })
            return
        }
        ctx.set("Cache-Control", "no-cache")
        ctx.set("Etag", hash)
        await next();


    }
}